<?php
/**
 * 购物车类
 *  
 * @author fosf.net
 * @copyright 2011
 */
class CartAPI extends spModel {
	private $CartArray = array(); // 存放购物车的二维数组
	private $CartCount; // 统计购物车数量
	public $sessionType = 'session'; // 保存方式：cookie方式保存或session方式保存
	public $Expires = 86400; // Cookies过期时间，如果为0则不保存到本地 单位为秒
	
	/**
	 * 构造函数 初始化操作 如果$Id不为空，则直接添加到购物车
	 *
	 */
	public function __construct($Id = "",$Pid="",$Name = "",$Size,$Price1 = "",$Price2 = "",$Price3 = "",$Count = "",$Other = "",$Expires = 86400) {
		if ($Id != "" && is_numeric($Id)) {
			$this->Expires = $Expires;
			$this->addCart($Id,$Pid,$Name,$Size,$Price1,$Price2,$Price3,$Count,$Other);
		}
	}
	/**
	 * 添加商品到购物车
	 *
	 * @param int $Id 商品的编号
	 * @param string $Name 商品名称
	 * @param decimal $Price1 商品价格
	 * @param decimal $Price2 商品价格
	 * @param decimal $Price3 商品价格
	 * @param int $Count 商品数量
	 * @param string $Other 商品其他信息
	 * @return 如果商品存在，则在原来的数量上加1，并返回false
	 */
	public function addCart($Id,$Pid,$Name,$Size,$Price1,$Price2,$Price3,$Count,$Other = "") {
	   
		$this->CartArray = $this->CartView(); // 把数据读取并写入数组
		if ($this->checkItem($Id,$Pid,$Size,$Price1)) {// 检测商品是否存在
			$this->ModifyCartOne($Pid,$Size,$Count,0); // 商品数量加$Count
            
			return false;
		}
		$this->CartArray['id'][$Id] = $Id;
        $this->CartArray['pid'][$Id] = $Pid;
		$this->CartArray['name'][$Id] = $Name;
        $this->CartArray['size'][$Id] = $Size;
		$this->CartArray['price1'][$Id] = $Price1;
		$this->CartArray['price2'][$Id] = $Price2;
		$this->CartArray['price3'][$Id] = $Price3;
		$this->CartArray['count'][$Id] = $Count;
		$this->CartArray['other'][$Id] = $Other;
		$this->save();
	}
	/**
	 * 修改商品的价格
	 * 
	 * @param string $type 价格字段，有三个：price1,price2,price3
	 * @param decimal $price 需要改成的价格
	 * @param int $id 商品编号
	 */
	public function ModifyPrice($type = 'price1',$price,$id) {
		$tmpArr = array('price1','price2','price3');
		if (!in_array($type,$tmpArr)) return false;
		if ($this->checkItem($id)) {
			$this->CartArray = $this->CartView(); // 把数据读取并写入数组
			$tmpArray = &$this->CartArray;  // 引用
			$tmpArray[$type][$id] = $price;
			$this->save();
		}
	}
 	/**
	 * 浏览购物重复商品添加数量
	 *  根据商品ID和尺码 
     * 
	 * @param int $Pid 商品ID
     * @param string $Size 尺码
	 * @param int $Count 商品数量
	 * @param int $Flag 修改类型 0：加 1:减
	 * @return 如果修改失败，则返回false
	 */
	public function ModifyCartOne($Pid,$Size,$Count, $Flag = "") {
	   //echo "可以执行";
       
       $pid=(int)$Pid;
       $Size=$Size;
       //echo $pid;
       $Count=(int)$Count;
       
		$this->CartArray = $this->CartView(); // 把数据读取并写入数组
		$tmpArray = &$this->CartArray;  // 引用
		if (!is_array($tmpArray['id'])) return false;
        
		if ($pid < 1) {
			return false;
		}
        
		foreach ($tmpArray['id'] as $item) {
		  
			if ($tmpArray['pid'][$item] == $pid && $tmpArray['size'][$item]==$Size) {
			 //echo $Id."-".$item."-".$Flag;
			 //echo "可以执行";
				switch ($Flag) {
					case 0: // 添加数量 一般$Count为1
                    
						$tmpArray['count'][$item] += $Count;
						break;
					case 1: // 减少数量
						$tmpArray['count'][$item] -= $Count;
						break;
					default:
						break;
				}
			}
		}
        
		$this->save();
	}
    
	/**
	 * 修改购物车里的商品
	 *
	 * @param int $Id 商品编号
	 * @param int $Count 商品数量
	 * @param int $Flag 修改类型 0：加 1:减 2:修改 3:清空
	 * @return 如果修改失败，则返回false
	 */
	public function ModifyCart($Id,$Count, $Flag = "") {
	   //echo "可以执行";
       
       $Id=(int)$Id;
       //echo $Id;
       $Count=(int)$Count;
       //echo $$Count;
		$this->CartArray = $this->CartView(); // 把数据读取并写入数组
		$tmpArray = &$this->CartArray;  // 引用
		if (!is_array($tmpArray['id'])) return false;
        
		if ($Id < 1) {
			return false;
		}
        
		foreach ($tmpArray['id'] as $item) {
		  
			if ($item == $Id) {
			 
			 //echo $Id."-".$item."-".$Flag;
			 //echo "可以执行";
				switch ($Flag) {
					case 0: // 添加数量 一般$Count为1
                    
						$tmpArray['count'][$Id] += $Count;
						break;
					case 1: // 减少数量
						$tmpArray['count'][$Id] -= $Count;
						break;
					case 2: // 修改数量
						if ($Count == 0) {
						    //echo $Id."等于0".$Count;
							unset($tmpArray['id'][$Id]);
                            unset($tmpArray['pid'][$Id]);
							unset($tmpArray['name'][$Id]);
                            unset($tmpArray['size'][$Id]);
							unset($tmpArray['price1'][$Id]);
							unset($tmpArray['price2'][$Id]);
							unset($tmpArray['price3'][$Id]);
							unset($tmpArray['count'][$Id]);
							unset($tmpArray['other'][$Id]);
							break;
						} else {
						  //echo $Id."-".$item."-".$Count;
						      //echo "等于".$Count;
							$tmpArray['count'][$Id] = $Count;
                            //echo $tmpArray['count'][$Id];
							break;
						}
					case 3: // 清空商品
						unset($tmpArray['id'][$Id]);
                        unset($tmpArray['pid'][$Id]);
						unset($tmpArray['name'][$Id]);
                        unset($tmpArray['size'][$Id]);
						unset($tmpArray['price1'][$Id]);
						unset($tmpArray['price2'][$Id]);
						unset($tmpArray['price3'][$Id]);
						unset($tmpArray['count'][$Id]);
						unset($tmpArray['other'][$Id]);
						break;
					default:
						break;
				}
			}
		}
        
		$this->save();
	}
	/**
	 * 清空购物车
	 *
	 */
	public function RemoveAll() {
		$this->CartArray = array();
		$this->save();
	}
	/**
	 * 查看购物车信息
	 *
	 * @return array 返回一个二维数组
	 */
	public function CartView() {
        $customersobj=spClass('customersSession');
        $customers=$customersobj->read();
        $customers=unserialize($customers);
        if($customers['customers_id']<>''){
           $tmplist=$customersobj->cartlist();
           $tmpUnSerialize =$tmplist;
        }else{
        $sessionobj=spClass('cartSession');
		$tmpUnSerialize = unserialize($sessionobj->read());
        }
		return $tmpUnSerialize;
	}
	/**
	 * 查看旧购物车信息
	 *
	 * @return array 返回一个二维数组
	 */
	public function CartViewold() {
        $sessionobj=spClass('cartSession');
		$tmpUnSerialize = unserialize($sessionobj->read());

		return $tmpUnSerialize;
	}    
	/**
	 * 检查购物车是否有商品
	 *
	 * @return bool 如果有商品，返回true，否则false
	 */
	public function checkCart() {
		$tmpArray = $this->CartArray = $this->CartView(); // 防止在此之前数据被外部修改
		if (count($tmpArray['id']) < 1) {			
			return false;
		}
		return true;
	}
	/**
	 * 商品统计
	 *
	 * @return array 返回一个一维数组 $arr['price1']:产品1的总价格 $arr['price2']:产品2的总价格 $arr['price3']:产品3的总价格 $arr['count']:产品的总数量
	 */
	public function CountPrice() {
		$tmpArray = $this->CartArray = $this->CartView(); // 防止在此之前数据被外部修改
		$outArray = array(); //一维数组
		// price1 是产品1的总价格
		// price2 是产品2的总价格
		// price3 是产品3的总价格
		// count  是产品的总数量
		$i = 0;
		if (is_array($tmpArray['id'])) {
			foreach ($tmpArray['id'] as $key=>$val) {
				$outArray['price1'] += $tmpArray['price1'][$key] * $tmpArray['count'][$key];
				//$outArray['price2'] += $tmpArray['price2'][$key] * $tmpArray['count'][$key];
                $outArray['price2'] += Get_price(array('pid'=>$tmpArray['pid'][$key],'price'=>$tmpArray['price1'][$key] * $tmpArray['count'][$key],'price2'=>$tmpArray['price2'][$key] * $tmpArray['count'][$key],'strtype'=>1,'GDcart'=>5));
				$outArray['price3'] += $tmpArray['price3'][$key] * $tmpArray['count'][$key];
				$outArray['count'] += $tmpArray['count'][$key];
				$i++;
			}
		}
		return $outArray;
	}
	/**
	 * 统计商品数量
	 *
	 * @return int
	 */
	public function CartCount() {
		$tmpArray = $this->CartView();
		$tmpCount = count($tmpArray['id']);
		$this->CartCount = $tmpCount;
		return $tmpCount;
	}
	/**
	 * 保存商品 如果不使用构造方法，此方法必须使用
	 *
	 */
	public function save() {
		$tmpArray = $this->CartArray;
		$tmpSerialize = serialize($tmpArray);
        $sessionobj=spClass('cartSession');
        $sessionobj->write($tmpSerialize,$this->Expires);  
	}
	/**
	 * 检查购物车商品是否存在
	 *
	 * @param int $Id
     * @param int $Pid
     * @param string $Size
     * @param int $price
	 * @return bool 如果存在 true 否则false
	 */
	private function checkItem($Id,$Pid,$Size,$price) {
	   //echo $Pid.$Size.$price;exit;
		$tmpArray = $this->CartView();
		if (!@is_array($tmpArray['id'])) return false;
		foreach ($tmpArray['id'] as $item) {
			if ($tmpArray['pid'][$item] == $Pid && $tmpArray['size'][$item]==$Size && $tmpArray['price1'][$item]==$price) return true;
		}
		return false;
	}
}
?>